React์ experimental_cache์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ํ๊ตฌํฉ๋๋ค. ํจ๊ณผ์ ์ธ ๊ตฌํ ๋ฐ ํ์ฉ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
React experimental_cache ๊ตฌํ: ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ ๋ง์คํฐํ๊ธฐ
React๋ ๊ฐ๋ฐ์๊ฐ ๋ ํจ์จ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์๋๋ก ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ฌํญ์ ์ง์์ ์ผ๋ก ๋์
ํ๊ณ ์์ต๋๋ค. ํ์ฌ ์คํ์ ์ธ ๊ธฐ๋ฅ ์ค ํ๋์ธ experimental_cache API๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ ์บ์ฑํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ, ํนํ React ์๋ฒ ์ปดํฌ๋ํธ(RSC) ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์๋๋ฆฌ์ค์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์ด ๊ธ์์๋ experimental_cache๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ ์ดํดํ๊ธฐ
ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ, ์ฆ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฅ ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฅํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋์ผํ ํจ์๊ฐ ๋์ผํ ์ธ์๋ก ๋ค์ ํธ์ถ๋ ๋, ํจ์๋ฅผ ๋ค์ ์คํํ๋ ๋์ ์บ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ด๋ ํนํ ๊ณ์ฐ๋์ด ๋ง์ ์ฐ์ฐ์ด๋ ์ธ๋ถ ๋ฐ์ดํฐ ์์ค์ ์์กดํ๋ ํจ์์ ์คํ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถ์ํฌ ์ ์์ต๋๋ค.
React์์ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค:
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: API ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ฉด ์ค๋ณต ๋คํธ์ํฌ ์์ฒญ์ ๋ฐฉ์งํ์ฌ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๊ณ ๋น์ฉ ์ฐ์ฐ: ๋ณต์กํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ฉด ๋ถํ์ํ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ์ฌ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ณ ์๋ต์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ ๋๋ง ์ต์ ํ: ์ปดํฌ๋ํธ ๋ด์์ ์ฌ์ฉ๋๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ ์บ์ฑํ๋ฉด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ๊ณผ ์ํธ ์์ฉ์ ์ ๋ํ ์ ์์ต๋๋ค.
React์ experimental_cache ์๊ฐ
React์ experimental_cache API๋ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ๊ตฌํํ๋ ๋ด์ฅ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. React ์๋ฒ ์ปดํฌ๋ํธ ๋ฐ use ํ
๊ณผ ์ํํ๊ฒ ์๋ํ๋๋ก ์ค๊ณ๋์ด ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์๋ฒ ์ธก ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ค์ ์ฐธ๊ณ ์ฌํญ: ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด experimental_cache๋ ์์ง ์คํ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค. ์ฆ, ํฅํ React ๋ฒ์ ์์ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ต์ React ๋ฌธ์๋ฅผ ์ฃผ์ํ๊ณ ์ ์ฌ์ ์ธ ํธํ์ฑ ๋ณ๊ฒฝ์ ๋๋นํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
experimental_cache ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
experimental_cache ํจ์๋ ํจ์๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ์๋ณธ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ ์บ์ฑํ๋ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ด๋ฅผ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค:
import { experimental_cache } from 'react';
async function fetchUserData(userId) {
// API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 500));
return { id: userId, name: `User ${userId}` };
}
const cachedFetchUserData = experimental_cache(fetchUserData);
async function MyComponent({ userId }) {
const userData = await cachedFetchUserData(userId);
return (
<div>
<p>User ID: {userData.id}</p>
<p>User Name: {userData.name}</p>
</div>
);
}
์ด ์์ ์์:
- 'react'์์
experimental_cache๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
ํ๋ ๋น๋๊ธฐ ํจ์
fetchUserData๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํจ์์๋ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ๋ํ๋ด๋ ์๋ฎฌ๋ ์ด์ ์ง์ฐ์ด ํฌํจ๋ฉ๋๋ค. fetchUserData๋ฅผexperimental_cache๋ก ๋ํํ์ฌ ์บ์๋ ๋ฒ์ ์ธcachedFetchUserData๋ฅผ ์์ฑํฉ๋๋ค.MyComponent๋ด์์cachedFetchUserData๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํฉ๋๋ค. ํน์ userId๋ก ์ด ํจ์๊ฐ ์ฒ์ ํธ์ถ๋๋ฉด ์๋ณธfetchUserDataํจ์๊ฐ ์คํ๋๊ณ ๊ฒฐ๊ณผ๊ฐ ์บ์์ ์ ์ฅ๋ฉ๋๋ค. ๋์ผํuserId๋ก ํ์ ํธ์ถํ๋ฉด ๋คํธ์ํฌ ์์ฒญ์ ํผํ๊ณ ์ฆ์ ์บ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ฉ๋๋ค.
React ์๋ฒ ์ปดํฌ๋ํธ ๋ฐ `use` ํ ๊ณผ ํตํฉ
experimental_cache๋ React ์๋ฒ ์ปดํฌ๋ํธ(RSC) ๋ฐ use ํ
๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ํนํ ๊ฐ๋ ฅํฉ๋๋ค. RSC๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์์ ์ฝ๋๋ฅผ ์คํํ์ฌ ์ฑ๋ฅ๊ณผ ๋ณด์์ ํฅ์์ํฌ ์ ์์ต๋๋ค. use ํ
์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ธ์์ง๋ ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ผ์ ์ค์งํ ์ ์์ต๋๋ค.
import { experimental_cache } from 'react';
import { use } from 'react';
async function fetchProductData(productId) {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 300));
return { id: productId, name: `Product ${productId}`, price: Math.random() * 100 };
}
const cachedFetchProductData = experimental_cache(fetchProductData);
function ProductDetails({ productId }) {
const product = use(cachedFetchProductData(productId));
return (
<div>
<h2>{product.name}</h2>
<p>Price: ${product.price.toFixed(2)}</p>
</div>
);
}
export default ProductDetails;
์ด ์์ ์์:
- ์ ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๊ธฐ ์ํด ๋น๋๊ธฐ ํจ์
fetchProductData๋ฅผ ์ ์ํฉ๋๋ค. fetchProductData๋ฅผexperimental_cache๋ก ๋ํํ์ฌ ์บ์๋ ๋ฒ์ ์ ์์ฑํฉ๋๋ค.ProductDetails์ปดํฌ๋ํธ(React ์๋ฒ ์ปดํฌ๋ํธ์ฌ์ผ ํจ) ๋ด์์useํ ์ ์ฌ์ฉํ์ฌ ์บ์๋ ํจ์์์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํฉ๋๋ค.useํ ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ธ์์ง๋ ๋์(๋๋ ์บ์์์ ๊ฒ์๋๋ ๋์) ์ปดํฌ๋ํธ๋ฅผ ์ผ์ ์ค์งํฉ๋๋ค. React๋ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ๋ก๋ฉ ์ํ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
RSC ๋ฐ use์ ํจ๊ป experimental_cache๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๊ณ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ๋ฐฉ์งํ์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์บ์ ๋ฌดํจํ
๋ง์ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ฅผ ๋ฌดํจํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํ๋กํ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ์บ์๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌดํจํํ์ฌ ์ ๋ฐ์ดํธ๋ ์ ๋ณด๊ฐ ํ์๋๋๋ก ํด์ผ ํฉ๋๋ค.
experimental_cache ์์ฒด๋ ์บ์ ๋ฌดํจํ๋ฅผ ์ํ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์์ฒด ์ ๋ต์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ ๋ฌดํจํ: ์บ์๋ ํจ์๋ฅผ ์ฌ์ค์ ํ๋ ๋ณ๋์ ํจ์๋ฅผ ๋ง๋ค์ด ์บ์๋ฅผ ์๋์ผ๋ก ์ง์ธ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ ์ญ ๋ณ์ ๋๋ ๋ ์ ๊ตํ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ: ์บ์๋ ๋ฐ์ดํฐ์ ๋ํด TTL(Time-To-Live)์ ์ค์ ํ ์ ์์ต๋๋ค. TTL์ด ๋ง๋ฃ๋๋ฉด ์บ์๊ฐ ๋ฌดํจํ๋๊ณ ํจ์์ ๋ํ ๋ค์ ํธ์ถ์ ์๋ณธ ํจ์๋ฅผ ๋ค์ ์คํํฉ๋๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฌดํจํ: ํน์ ์ด๋ฒคํธ(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฐ์ดํธ ๋๋ ์ฌ์ฉ์ ์์ )๊ฐ ๋ฐ์ํ ๋ ์บ์๋ฅผ ๋ฌดํจํํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์๋ตํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
์๋ ๋ฌดํจํ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import { experimental_cache } from 'react';
let cacheKey = 0; // ์ ์ญ ์บ์ ํค
async function fetchUserProfile(userId, key) {
console.log("Fetching user profile (Key: " + key + ")"); // ๋๋ฒ๊ทธ ๋ก๊ทธ
await new Promise(resolve => setTimeout(resolve, 200));
return { id: userId, name: `Profile ${userId}`, cacheKey: key };
}
let cachedFetchUserProfile = experimental_cache(fetchUserProfile);
function invalidateCache() {
cacheKey++; // ์ ์ญ ์บ์ ํค ์ฆ๊ฐ
// ์บ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ค์ ํ๋ ์บ์๋ ํจ์ ์ฌ์์ฑ.
cachedFetchUserProfile = experimental_cache(fetchUserProfile);
}
async function UserProfile({ userId }) {
const profile = await cachedFetchUserProfile(userId, cacheKey);
return (
<div>
<h2>User Profile</h2>
<p>ID: {profile.id}</p>
<p>Name: {profile.name}</p>
<p>Cache Key: {profile.cacheKey}</p>
<button onClick={invalidateCache}>Update Profile</button>
</div>
);
}
์ด ์์ ์์๋ "Update Profile" ๋ฒํผ์ ํด๋ฆญํ๋ฉด invalidateCache๊ฐ ํธ์ถ๋์ด ์ ์ญ cacheKey๋ฅผ ์ฆ๊ฐ์ํค๊ณ ์บ์๋ ํจ์๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด cachedFetchUserProfile์ ๋ํ ๋ค์ ํธ์ถ์์ ์๋ณธ fetchUserProfile ํจ์๋ฅผ ๋ค์ ์คํํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
์ค์: ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ๋ฌดํจํ ์ ๋ต์ ์ ํํ๊ณ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ํฅ์ ๋ํด ์ ์คํ๊ฒ ๊ณ ๋ คํ์ญ์์ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
experimental_cache๋ฅผ ์ฌ์ฉํ ๋๋ ๋ค์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ผ๋์ ๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์บ์ ํค ์ ํ: ์บ์ ํค๋ฅผ ๊ฒฐ์ ํ๋ ์ธ์๋ฅผ ์ ์คํ๊ฒ ์ ํํ์ญ์์ค. ์บ์ ํค๋ ์บ์ฑ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํด์ผ ํฉ๋๋ค. ๋จ์ผ ์ธ์๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ ์ฌ๋ฌ ์ธ์์ ์กฐํฉ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์บ์ ํฌ๊ธฐ:
experimental_cacheAPI๋ ์บ์ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ฒด ์บ์ ์ ๊ฑฐ ์ ๋ต์ ๊ตฌํํด์ผ ํ ์ ์์ต๋๋ค. - ๋ฐ์ดํฐ ์ง๋ ฌํ: ์บ์ฑ๋๋ ๋ฐ์ดํฐ๊ฐ ์ง๋ ฌํ ๊ฐ๋ฅํ์ง ํ์ธํ์ญ์์ค.
experimental_cacheAPI๋ ์ ์ฅ์ฉ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํด์ผ ํ ์ ์์ต๋๋ค. - ์ค๋ฅ ์ฒ๋ฆฌ: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์คํจํ๊ฑฐ๋ ์บ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํฉ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค.
- ํ ์คํธ: ์บ์ฑ ๊ตฌํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ์บ์๊ฐ ์ ์ ํ๊ฒ ๋ฌดํจํ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์บ์ฑ์ ์ํฅ์ ํ๊ฐํ๊ณ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค.
- ์ ์ญ ์ํ ๊ด๋ฆฌ: ์๋ฒ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ(์: ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ค์ , ์ฅ๋ฐ๊ตฌ๋ ๋ด์ฉ), ์บ์ฑ์ด ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์๋ก์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋ฐฉ์์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ๊ณ ๋ คํ์ญ์์ค. ๋ฐ์ดํฐ ๋์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ๋ณดํธ ์กฐ์น๋ฅผ ๊ตฌํํ์ญ์์ค. ์บ์ ํค์ ์ฌ์ฉ์ ID๋ฅผ ํฌํจํ๊ฑฐ๋ ์๋ฒ ์ธก ๋ ๋๋ง์ ํนํ๋ ์ ์ญ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋ฐ์ดํฐ ๋์ฐ๋ณ์ด: ๋์ฐ๋ณ์ด๊ฐ ๋ฐ์ํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ ๋๋ ๊ทน๋๋ก ์ฃผ์ํ์ญ์์ค. ์ค๋๋๊ฑฐ๋ ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๋๋ก ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์บ์๋ฅผ ๋ฌดํจํํด์ผ ํฉ๋๋ค. ์ด๋ ๋ค๋ฅธ ์ฌ์ฉ์ ๋๋ ํ๋ก์ธ์ค์์ ์์ ํ ์ ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ํนํ ์ค์ํฉ๋๋ค.
- ์๋ฒ ์ก์ ๋ฐ ์บ์ฑ: ์ปดํฌ๋ํธ์์ ์ง์ ์๋ฒ ์ธก ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์๋ฒ ์ก์ ๋ ์บ์ฑ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ์๋ฒ ์ก์ ์ด ๊ณ์ฐ์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์ํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ๊ฐ์ ์บ์ฑํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํนํ ์๋ฒ ์ก์ ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ๋ฌดํจํ ์ ๋ต์ ์ ์ํ์ญ์์ค.
experimental_cache์ ๋์
experimental_cache๋ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ๊ตฌํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ณ ๋ คํ ์ ์๋ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค:
- ๋ฉ๋ชจ์ด์ ์ด์
๋ผ์ด๋ธ๋ฌ๋ฆฌ:
memoize-one๋ฐlodash.memoize์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ์ ์ง์ ์บ์ ํค, ์บ์ ์ ๊ฑฐ ์ ์ฑ ๋ฐ ๋น๋๊ธฐ ํจ์ ์ง์์ ํฌํจํ์ฌ ๋ ๊ณ ๊ธ ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. - ์ฌ์ฉ์ ์ง์ ์บ์ฑ ์๋ฃจ์
:
Map๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋node-cache์ ๊ฐ์ ์ ์ฉ ์บ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์๋ฒ ์ธก ์บ์ฑ์ฉ)๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด ์บ์ฑ ์๋ฃจ์ ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์บ์ฑ ํ๋ก์ธ์ค์ ๋ํ ๋ ๋ง์ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง ๊ตฌํ ๋ ธ๋ ฅ์ด ๋ ๋ง์ด ํ์ํฉ๋๋ค. - HTTP ์บ์ฑ: API์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ
Cache-Controlํค๋์ ๊ฐ์ HTTP ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ CDN์ด ์๋ต์ ์บ์ํ๋๋ก ์ง์ํฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ํธ๋ํฝ์ ํฌ๊ฒ ์ค์ด๊ณ ํนํ ์ ์ ๋๋ ์์ฃผ ์ ๋ฐ์ดํธ๋์ง ์๋ ๋ฐ์ดํฐ์ ๋ํ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
๋ค์์ experimental_cache(๋๋ ์ ์ฌํ ์บ์ฑ ๊ธฐ๋ฒ)๊ฐ ๋งค์ฐ ์ ์ตํ ์ ์๋ ์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค:
- ์ ์ ์๊ฑฐ๋ ์ ํ ์นดํ๋ก๊ทธ: ์ ํ ์ธ๋ถ ์ ๋ณด(์ด๋ฆ, ์ค๋ช , ๊ฐ๊ฒฉ, ์ด๋ฏธ์ง)๋ฅผ ์บ์ฑํ๋ฉด ํนํ ๋๊ท๋ชจ ์นดํ๋ก๊ทธ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ ์๊ฑฐ๋ ์น ์ฌ์ดํธ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ๋ฐ ๊ธฐ์ฌ: ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ๋ฐ ๊ธฐ์ฌ๋ฅผ ์บ์ฑํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ๋ฅผ ์ค์ด๊ณ ๋ ์๋ฅผ ์ํ ๋ธ๋ผ์ฐ์ง ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ์์ ๋ฏธ๋์ด ํผ๋: ์ฌ์ฉ์ ํผ๋ ๋ฐ ํ์๋ผ์ธ์ ์บ์ฑํ๋ฉด ์ค๋ณต API ํธ์ถ์ ๋ฐฉ์งํ๊ณ ์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๊ธ์ต ๋ฐ์ดํฐ: ์ค์๊ฐ ์ฃผ๊ฐ ๋๋ ํ์จ์ ์บ์ฑํ๋ฉด ๊ธ์ต ๋ฐ์ดํฐ ์ ๊ณต์ ์ฒด์ ๋ถํ๋ฅผ ์ค์ด๊ณ ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋งคํ ์ ํ๋ฆฌ์ผ์ด์ : ์ง๋ ํ์ผ ๋๋ ์ง์ค์ฝ๋ฉ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ฉด ๋งคํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์ง๋ ์๋น์ค ์ฌ์ฉ ๋น์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
- ๊ตญ์ ํ(i18n): ๋ค๋ฅธ ๋ก์ผ์ผ์ ๋ํ ๋ฒ์ญ๋ ๋ฌธ์์ด์ ์บ์ฑํ๋ฉด ์ค๋ณต ์กฐํ๋ฅผ ๋ฐฉ์งํ๊ณ ๋ค๊ตญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๊ฐ์ธํ๋ ์ถ์ฒ: ๊ฐ์ธํ๋ ์ ํ ๋๋ ์ฝํ ์ธ ์ถ์ฒ์ ์บ์ฑํ๋ฉด ์ถ์ฒ ์์ฑ์ ๊ณ์ฐ ๋น์ฉ์ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์คํธ๋ฆฌ๋ฐ ์๋น์ค๋ ์ฌ์ฉ์์ ์์ฒญ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์ํ ์ถ์ฒ์ ์บ์ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React์ experimental_cache API๋ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ๊ตฌํํ๊ณ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ์ดํดํ๊ณ , React ์๋ฒ ์ปดํฌ๋ํธ ๋ฐ use ํ
๊ณผ ํตํฉํ๊ณ , ์บ์ ๋ฌดํจํ ์ ๋ต์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ต์ฑ๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์คํ์ ์ธ API์ด๋ฏ๋ก ์ต์ React ๋ฌธ์๋ฅผ ๊ณ์ ํ์ธํ๊ณ ์ ์ฌ์ ์ธ ๋ณ๊ฒฝ์ ๋๋นํด์ผ ํฉ๋๋ค. ์ด ๊ธ์์ ์ค๋ช
ํ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด experimental_cache๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ํ๋ฅญํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
experimental_cache๋ฅผ ํ์ํ๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ ์ฌํญ์ ๊ณ ๋ คํ๊ณ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ์บ์ฑ ์ ๋ต์ ์ ํํ์ญ์์ค. ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ ๋ฐฉ์์ ์ฐพ๊ธฐ ์ํด ์คํํ๊ณ ๋์์ ์ธ ์บ์ฑ ์๋ฃจ์
์ ํ์ํ๋ ๊ฒ์ ๋๋ ค์ํ์ง ๋ง์ญ์์ค. ์ ์คํ ๊ณํ๊ณผ ๊ตฌํ์ ํตํด ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ณ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๋ชจ๋ ๊ฐ์ถ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.